Skip to content

fix(prose-tests): the verdict names only the model the record names#567

Merged
leeovery merged 1 commit into
mainfrom
fix/prose-verdict-states-only-what-is-recorded
Jul 27, 2026
Merged

fix(prose-tests): the verdict names only the model the record names#567
leeovery merged 1 commit into
mainfrom
fix/prose-verdict-states-only-what-is-recorded

Conversation

@leeovery

@leeovery leeovery commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Summary

Found by deliberately breaking a skill to prove the harness catches it. It did — and turned up something else on the way.

The orchestrator returned:

MODEL: first walk claude-sonnet-5, escalated rerun claude-opus-5
       (asserter: claude-sonnet-5 both times)

The asserter was not on Sonnet. Every asserter transcript from that run is claude-opus-5 with zero tool calls, exactly as contracted; the Sonnet agents were the orchestrators, which are Sonnet by design.

And it had no way to know either way. The only model anywhere in the record comes off the walker's SubagentStop line. No agent's own model appears anywhere it can read.

So a slot that exists to carry a fact carried a guess — in the one field whose whole purpose is catching a run that silently used the wrong model. MODEL: now states the walking model and nothing else.

The break test itself (reverted, never committed)

Moved render phase-note above the status read in workflow-investigation-entry — a plausible "announce the phase first" reordering. Result:

VERDICT: FAIL
FAIL  calls_in_order — "render phase-note" never ran after
                       "manifest get crash-fix.investigation.crash-fix status"
PASS  calls_include  — ran all of: … status, render phase-note
N/A   engine_before_write — no workflow state was written
PATH: 4/5 — step 4 fails on both runs

Every layer behaved:

  • calls_in_order caught it while calls_include passed — both calls ran, just out of order. Precisely the gap ordering was added for, now proven on real prose rather than a unit test.
  • engine_before_write reported N/A, not a misleading green tick.
  • Escalation fired for the first time: Sonnet walked and failed, the orchestrator rebuilt the world and reran on Opus, Opus failed identically → confirmed defect rather than flake.
  • The CHECKS line surfaced the computed facts instead of leaving them to be inferred from a green overall verdict.

Test plan

  • Prose gate unchanged and green
  • Working tree verified clean after revert; the broken prose was never committed

🤖 Generated with Claude Code

Stack

  1. docs(design): prose-tests programme design log #544
  2. feat(prose-tests): the framework — cases, worlds, runner, skill #545
  3. test(prose): feature happy-path corpus — five worlds, seven cases #546
  4. test(prose): bugfix corpus — the investigation-centric surfaces #548
  5. test: retry recursive teardown removals — kill a class of phantom failures #549
  6. fix(entry-skills): close the handoff fences — six files render their arms wrong #550
  7. docs: a contributing page for working on the system #551
  8. fix(entry-skills): every handoff arm says to invoke the skill #552
  9. fix(implementation): environment setup belongs to the setup reference alone #553
  10. fix(prose-tests): the asserter is told which substitutions were armed #554
  11. feat(prose-tests): the mid-flow substitution, and a world only prose can describe #555
  12. test(prose): claims assert consequences, not what was displayed #556
  13. feat(prose-tests): record everything the agents do, results included #557
  14. fix(discussion-entry): the handoff reports the source it actually had #558
  15. fix(prose-tests): the stop hook records, and names the model that walked #559
  16. fix(prose-tests): command output was never actually recorded #560
  17. feat(prose-tests): judge the walk as told, not the summary returned #561
  18. feat(prose-tests): decide in code what an agent should not be deciding #562
  19. test(prose): a case starts where a session starts #563
  20. feat(prose-tests): walk on Sonnet, judge on Opus, escalate a failure #564
  21. test(prose): give the eight read-only cases something that can fail #565
  22. test(prose): only walks that can be observed, and checks that survive the trip #566
  23. fix(prose-tests): the verdict names only the model the record names #567 👈 current
  24. test(prose): discovery, walked to the point where work first exists #568
  25. fix(prose-tests): the asserter judges which of prose or walker was at fault #569
  26. docs(conventions): a step whose reference routes every exit still signposts #570
  27. test(prose): discovery's epic arm, to the same durability boundary #571
  28. fix(prose-tests): keep the walk's closing turn, and name the one live difference #572
  29. fix(prose-tests): prescribe the cross-check, drop a check that cannot fire, lint the scope #573
  30. test(prose): declare the prose each case actually walks #574
  31. fix(investigation): the symptom interview never ran for work shaped in discovery #575
  32. feat(prose-tests): conduct — playing a person where a script cannot reach #576
  33. fix(prose-tests): what a write put in a file is evidence, not incident #577
  34. fix(investigation): the interview starts from the carrier, not over it #578
  35. test(prose): quick-fix scoping, the whole definition stage in one walk #579
  36. fix(prose-tests): the world log is the walker's record #580
  37. fix(prose-tests): a confirmed failure reports both runs' checks #581
  38. fix(prose-tests): each prescribed command runs as written #582
  39. fix(scoping): context gathering reads the whole carrier, asks only the gaps #583

This was referenced Jul 26, 2026
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 430c8dc to 57d99f8 Compare July 27, 2026 14:49
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from cfcff30 to 744a17c Compare July 27, 2026 14:49
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 57d99f8 to cf58af4 Compare July 27, 2026 14:51
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 744a17c to 02a55bc Compare July 27, 2026 14:51
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from cf58af4 to ebd050d Compare July 27, 2026 15:42
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 02a55bc to f0ec7c5 Compare July 27, 2026 15:42
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from ebd050d to 845a7f4 Compare July 27, 2026 15:44
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from f0ec7c5 to ee0c976 Compare July 27, 2026 15:44
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 845a7f4 to c03f47a Compare July 27, 2026 15:46
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from ee0c976 to 1584692 Compare July 27, 2026 15:46
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from c03f47a to 38f49ff Compare July 27, 2026 15:47
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 1584692 to 4695ffa Compare July 27, 2026 15:47
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 38f49ff to 0ed3ffc Compare July 27, 2026 15:49
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 4695ffa to cfb4c75 Compare July 27, 2026 15:49
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 0ed3ffc to 387bb5c Compare July 27, 2026 15:50
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from cfb4c75 to d82bb34 Compare July 27, 2026 15:50
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 387bb5c to 6d7d97a Compare July 27, 2026 15:52
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from d82bb34 to b5cef3d Compare July 27, 2026 15:52
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 6d7d97a to ed93a3a Compare July 27, 2026 15:53
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from b5cef3d to 7b9d9c3 Compare July 27, 2026 15:53
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from ed93a3a to aca3c67 Compare July 27, 2026 15:54
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 7b9d9c3 to ca28506 Compare July 27, 2026 15:54
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from aca3c67 to 48f12e7 Compare July 27, 2026 15:55
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from ca28506 to 3b9b0b0 Compare July 27, 2026 15:55
@leeovery
leeovery force-pushed the test/prose-observable-walks-only branch from 48f12e7 to 2ee5855 Compare July 27, 2026 15:57
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 3b9b0b0 to 8378abd Compare July 27, 2026 15:57
@leeovery
leeovery changed the base branch from test/prose-observable-walks-only to main July 27, 2026 15:57
Deliberately breaking a skill to prove the harness catches it turned up
something else. The orchestrator returned "first walk claude-sonnet-5,
escalated rerun claude-opus-5 (asserter: claude-sonnet-5 both times)".

The asserter was not on Sonnet. Every asserter transcript from that run
is claude-opus-5, with zero tool calls, exactly as contracted; the Sonnet
agents were the orchestrators, which are Sonnet by design. Nor could the
orchestrator have known either way — the only model in the record comes
off the walker's SubagentStop line, and no agent's own model appears
anywhere it can read.

So a slot that exists to carry a fact carried a guess, in the one field
whose entire purpose is catching a run that silently used the wrong
model. The MODEL line now states the walking model and nothing else.

The break itself was caught cleanly and reverted uncommitted:
calls_in_order failed naming the exact defect while calls_include passed,
which is the gap ordering was added for; engine_before_write reported N/A
rather than a green tick; and the escalation ran for the first time,
Opus reproducing the Sonnet failure into a confirmed finding.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@leeovery
leeovery force-pushed the fix/prose-verdict-states-only-what-is-recorded branch from 8378abd to 1cea24e Compare July 27, 2026 15:58
@leeovery
leeovery merged commit 36261f9 into main Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant